var WComments = { init: function (options) { extend(cur, { options: options, oid: options.user_id, postTo: options.user_id, heightEl: geByClass1('_wcomments_page'), countEl: geByClass1('_wcomments_count'), contentEl: geByClass1('_wcomments_content'), section: options.section, noAwayCheck: true, sendPostBtn: ge('send_post'), postsEl: ge('wcomments_posts'), postsOuterEl: geByClass1('_wcomments_posts_outer'), wallType: 'widget_comments', onReplyFormSizeUpdate: WComments.contentUpdated.bind(WComments, false), onEditFormSizeUpdate: WComments.contentUpdated.bind(WComments, false) }); cur.options.filter_media_types = cur.options.media_types || []; this.override('lite.js'); this.override('page.js'); this.override('emoji.js'); this.override('ui_media_selector.js', true); stManager.emitter.addListener('update', this.override.bind(this)); this.updateSize(); if (options.is_auto || options.is_nano) { extend(options, { media_opts: { hideAfterCount: 0, maxShown: 0 } }); } Wall.init(options); if (options.fixed_height) { setStyle(cur.postsOuterEl, { maxHeight: options.fixed_height - getSize(geByClass1('_wcomments_head'))[1] - getSize(geByClass1('_wcomments_form'))[1] }); cur.scrollbar = new uiScroll(cur.postsOuterEl, { hidden: 1, onmore: this.showMore.bind(this), ondragstart: function() {cur.Rpc.callMethod('startDrag')}, ondragstop: function() {cur.Rpc.callMethod('stopDrag')} }); cur.mouseMove = cur.scrollbar.ondrag.bind(cur.scrollbar); cur.mouseUp = cur.scrollbar.ondragstop.bind(cur.scrollbar) } else { cur.mouseMove = function() {}; cur.mouseUp = function() {}; } options.qtransport && this.initQTransport(options.qtransport); // Times update interval. For relative time correction timeUpdateInt = setInterval(this.updateTimes.bind(this), 10000); cur.RpcMethods = { onInit: function() { var resizeWidget = this.resizeWidget.bind(this); setTimeout(resizeWidget, 0); setTimeout(resizeWidget, 500); }.bind(this), updateStickers: function() { window.emojiStickers = false; window.Emoji && Emoji.updateTabs(); }, mouseMove: cur.mouseMove, mouseUp: cur.mouseUp, chooseMedia: function() { var args = cleanObj(this.uncleanObj([].slice.call(arguments))); cur.chooseMedia.apply(cur.chooseMedia, args); setTimeout(this.resizeWidget.bind(this), 0); }.bind(this), showMediaProgress: function() { var args = cleanObj([].slice.call(arguments)); cur.showMediaProgress.apply(cur.showMediaProgress, args); }, likeFullUpdate: function() {} }; try { cur.Rpc = new fastXDM.Client(cur.RpcMethods, {safe: true}); cur.resizeInt = setInterval(this.resizeWidget.bind(this), 1000); } catch (e) { debugLog(e); } if (!options.user_id) { addEvent('send_post', 'click', Widgets.auth.bind(Widgets)); addEvent('post_field', 'click focus', Widgets.auth.bind(Widgets)); } }, uncleanObj: function(data) { if (isObject(data)) { var dataUncleaned = {}; for(var i in data) { dataUncleaned[i.replace(/[^a-zA-Z0-9_\-]/g, '')] = this.uncleanObj(data[i]); } } else if (isArray(data)) { var dataUncleaned = []; for(var i in data) { dataUncleaned.push(this.uncleanObj(data[i])); } } else { var type = typeof(data); if (type == 'number' || type == 'boolean' || type == 'function') { var dataUncleaned = data; } else { var dataUncleaned = unclean(data); } } return dataUncleaned; }, getSectionParams: function () { var params = { app: cur.options.app, width: cur.options.width, limit: cur.options.limit }; switch (cur.section) { case 'admin_browse': params.act = 'admin_browse'; break; case 'admin_bl': params.act = 'admin_bl'; params.limit = 15; break; case 'admin_updates': params.act = 'admin_updates'; break; case 'browse': params.browse = 1; params.replies = cur.options.replies; break; default: // posts params.page_query = cur.options.page_query; params.part = 1; } return params }, contentUpdated: function(options) { options && this.applyOptions(options); this.resizeWidget(); }, applyOptions: function (options) { if (options.reply_names) { cur.options.reply_names = extend(cur.options.reply_names || {}, options.reply_names); delete options.reply_names; } if (options.head_count && cur.section != 'browse') { val(geByClass1('_wcomments_count'), options.head_count); delete options.head_count; } if (options.script) { eval(options.script); delete options.script; } extend(cur.options, options); toggle(geByClass1('_wcomments_more'), options.offset < options.count); }, updateSize: function self(size) { var width = (size ? size : getSize('page_wrap'))[0]; setStyle(cur.heightEl, {'width': width}); // need for scroll if (cur.options.is_auto) { var isMini = cur.options.mini == 1 || cur.options.mini != 0 && width < 630, isNano = isMini && width < 380; if (self.size != isMini+''+isNano) { self.size = isMini+''+isNano; replaceClass(bodyNode, 'wcomments_mini wcomments_nano', (isMini ? 'wcomments_mini ' : '')+(isNano ? 'wcomments_nano ' : '')); } } }, resizeWidget: function self() { if (!cur.heightEl || !cur.Rpc) return; var size = getSize('page_wrap'); if (browser.msie && !browser.msie8 || browser.opera) size[1] += 15; window.onBodyResize && onBodyResize(); if (self.size != size.join(' ')) { self.size = size.join(' '); this.updateSize(size); cur.Rpc.callMethod('resize', size[1]); } }, showMore: function () { if (cur.switchingSection) return; var moreBtn = geByClass1('_wcomments_more'); if (cur.options.offset >= cur.options.count) return hide(moreBtn); if (buttonLocked(moreBtn)) return; ajax.post('al_widget_comments.php', extend(WComments.getSectionParams(), { offset: cur.options.offset, width: cur.options.width, part: 1 }), { onDone: function (options, rows) { ge('wcomments_posts').appendChild(cf(rows)); WComments.contentUpdated(options); }, showProgress: lockButton.pbind(moreBtn), hideProgress: unlockButton.pbind(moreBtn) }); }, switchSection: function (section) { if (cur.switchingSection || cur.section == section) return false; cur.switchingSection = true; var tabs = uiTabs && geByClass1('_wcomments_admin_tabs'), tab = tabs && geByClass1('_' + section); if (section == 'posts' || cur.section == 'posts') { addClass(cur.contentEl, 'wcomments_content_loading'); } else { tabs && uiTabs.showProgress(tabs); } tab && uiTabs.switchTab(geByClass1('ui_tab', tab)); cur.section = section; ajax.post('al_widget_comments.php', WComments.getSectionParams(), { onDone: function (options, rows) { val(cur.postsEl, rows); tabs && uiTabs.hideProgress(tabs); removeClass(cur.contentEl, 'wcomments_content_loading'); replaceClass(cur.heightEl, 'wcomments_section_posts wcomments_section_admin_browse wcomments_section_admin_bl wcomments_section_admin_updates wcomments_section_browse', 'wcomments_section_' + section); cur.options.fixed_height && setStyle(cur.postsOuterEl, { maxHeight: cur.options.fixed_height - getSize(geByClass1('_wcomments_head'))[1] - getSize(cur.section == 'posts' || cur.section == 'browse' ? geByClass1('_wcomments_form') : geByClass1('_wcomments_admin_tabs'))[1] }); cur.switchingSection = false; cur.scrollbar && cur.scrollbar.scrollTop(); WComments.contentUpdated(options); } }); return false; }, addToBl: function (mid, hash, action) { if (hasClass(action, 'wcomments_bl_action_loading')) return false; ajax.post('al_widget_comments.php', { act: 'a_add_to_bl', id: mid, hash: hash, app: cur.options.app }, { onDone: function() { hide(geByClass1('_wcomments_bl_label_' + mid)); action.onclick = WComments.delFromBl.bind(WComments, mid, hash, action); val(action, getLang('widgets_remove_from_banlist')); }, showProgress: addClass.pbind(action, 'wcomments_bl_action_loading'), hideProgress: removeClass.pbind(action, 'wcomments_bl_action_loading') }); }, delFromBl: function (mid, hash, action) { if (hasClass(action, 'wcomments_bl_action_loading')) return false; ajax.post('al_widget_comments.php', { act: 'a_del_from_bl', id: mid, hash: hash, app: cur.options.app }, { onDone: function() { setStyle(geByClass1('_wcomments_bl_label_' + mid), 'display', 'inline'); action.onclick = WComments.addToBl.bind(WComments, mid, hash, action); val(action, getLang('widgets_restore_to_banlist')); }, showProgress: addClass.pbind(action, 'wcomments_bl_action_loading'), hideProgress: removeClass.pbind(action, 'wcomments_bl_action_loading') }); }, updateTimes: function(cont) { if (!(cur.lang || {}).wall_X_seconds_ago_words) { return; } var timeNow = intval(vkNow() / 1000), toClean = []; timeNow -= cur.tsDiff; each(geByClass('rel_date_needs_update', cont || ge('wcomments_posts'), 'span'), function(k, v) { if (!v) return; var timeRow = intval(v.getAttribute('time')), diff = timeNow - timeRow, timeText = v.getAttribute('abs_time'); if (diff < 5) { timeText = getLang('wall_just_now'); } else if (diff < 60) { timeText = Wall.langWordNumeric(diff, cur.lang.wall_X_seconds_ago_words, cur.lang.wall_X_seconds_ago); } else if (diff < 3600) { timeText = Wall.langWordNumeric(intval(diff / 60), cur.lang.wall_X_minutes_ago_words, cur.lang.wall_X_minutes_ago); } else if (diff < 4 * 3600) { timeText = Wall.langWordNumeric(intval(diff / 3600), cur.lang.wall_X_hours_ago_words, cur.lang.wall_X_hours_ago); } else { toClean.push(v); } v.innerHTML = timeText; }); each (toClean, function () { removeClass(this, 'rel_date_needs_update'); }); }, langWordNumeric: function(num, words, arr) { if (isArray(words) && num < words.length) { return words[num]; } return langNumeric(num, arr); }, showLikesBox: function (obj, params) { showBox('widget_like.php', extend({ act: 'a_stats_box', app: cur.options.app, obj: obj, from: 'wcomments', check_hash: cur.likeCheckHash, widget_width: 638 }, params || {})); }, deleteAllAndBan: function (post_id, mid, hash, btn) { ajax.post('al_widget_comments.php', { act: 'a_add_to_bl', id: mid, hash: hash, app: cur.options.app }, { onDone: function (response, earliest_post_id) { earliest_post_id && each(geByClass('wcomments_post', ge('wcomments_posts'), 'div'), function() { !this.id.indexOf('post' + mid) && this.id.split('_')[1] >= earliest_post_id && this.id != 'post' + post_id && isVisible(this) && hide(this); }); ge('post_del' + post_id).innerHTML = response; WComments.contentUpdated(); }, showProgress: function () { lockButton(btn); }, hideProgress: function () { unlockButton(btn); } }); }, initQTransport: function (options) { window.curNotifier = extend(options, { lp_connected: false, error_timeout: 1, addQueues: {}, recvClbks: {}, recvData: {}, onConnectionId: [] }); WComments.lpInit(); WComments.lpStart(); }, lpGetTransportWrap: function () { var queueCont = ge('queue_transport_wrap'); if (!queueCont) { queueCont = ce('div', {id: 'queue_transport_wrap'}); utilsNode.appendChild(queueCont); } return queueCont; }, /* Long-poll methods */ lpInit: function () { if (curNotifier.lpMakeRequest) return; delete curNotifier.lpMakeRequest; re('queue_transport_frame'); WComments.lpGetTransportWrap().appendChild( ce('iframe', { id: 'queue_transport_frame', name: 'queue_transport_frame', src: curNotifier.frame_path }) ); }, lpStart: function () { curNotifier.lp_started = true; WComments.lpCheck(); }, lpStop: function () { curNotifier.lp_started = false; clearTimeout(curNotifier.lp_check_to); clearTimeout(curNotifier.lp_error_to); }, lpCheck: function () { if (!curNotifier.lp_started) return; if (!curNotifier.lpMakeRequest) { curNotifier.lp_check_to = setTimeout(this.lpCheck.bind(this), 1000); return; } curNotifier.lpMakeRequest(curNotifier.frame_url, { act: 'a_check', ts: curNotifier.timestamp, key: curNotifier.key, id: curNotifier.uid, wait: 25 }, function (text) { if (!curNotifier.lp_started) return; try { var success = this.lpChecked(eval('(' + text + ')')); if (success) { this.lpCheck(); curNotifier.error_timeout = 1; } } catch (e) { topError('Notify error: ' + e.message); curNotifier.lp_error_to = setTimeout(this.lpCheck.bind(this), curNotifier.error_timeout * 1000); if (curNotifier.error_timeout < 64) { curNotifier.error_timeout *= 2; } } }.bind(this), function (msg) { curNotifier.lp_error_to = setTimeout(this.lpCheck.bind(this), curNotifier.error_timeout * 1000); if (curNotifier.error_timeout < 64) { curNotifier.error_timeout *= 2; } }.bind(this)); }, lpChecked: function(response) { var failed = response.failed; if (failed == 2) { curNotifier.lp_error_to = setTimeout(this.lpGetKey.bind(this), curNotifier.error_timeout * 1000); if (curNotifier.error_timeout < 64) { curNotifier.error_timeout *= 2; } return false; } else if (failed) { throw getLang('global_unknown_error'); } curNotifier.timestamp = response.ts; if (!cur.section.indexOf('admin')) { return true; } cur.saveScrollPosition = cur.scrollbar && cur.scrollbar.data.scrollTop > 100; each(response.events, function (k, v) { WComments.eventsParse(v); }); return true; }, lpGetKey: function () { var stNow = vkNow(); ajax.post('al_widget_comments.php', {act: 'a_get_key', id: curNotifier.uid, app: cur.options.app, page_query: cur.options.page_query}, { onDone: function (key, ts) { curNotifier.timestamp = ts; curNotifier.key = key; this.lpCheck(); }.bind(this), onFail: function (code) { if (code == 3) { location.reload(); return; } curNotifier.error_timeout = 64; this.lp_error_to = setTimeout(this.lpGetKey.bind(this), curNotifier.error_timeout * 1000); if (curNotifier.error_timeout < 64) { curNotifier.error_timeout *= 2; } return true; }.bind(this) }); }, /* Resize post content for pushed updates */ resizePostSizedThumbs: function(meshEl, widthTo, marginFrom, heightTo) { var tileEls = geByClass('page_post_thumb_wrap', meshEl), lines = [], widthTaken = 0, heightTaken = 0, Line = function() { line && lines.push(line); widthTaken = heightTaken = 0; extend(this, { tiles:[], height: 0, x: 0, y: 0 }); }, Tile = function(tileEl) { if (!tileEl) return; extend(this, { el: tileEl, lastRow: hasClass(tileEl, 'page_post_thumb_last_row'), lastColumn: hasClass(tileEl, 'page_post_thumb_last_column'), width: intval(tileEl.style.width), height: intval(tileEl.style.height) }) }, line = new Line(), widthFrom = positive(meshEl.style.width), heightFrom = positive(meshEl.style.height), heightToTaken = 0; // decrease size only if (widthTo > widthFrom) widthTo = null; if (heightTo > heightFrom) heightTo = null; if (!heightTo && widthTo) { heightTo = Math.floor(heightFrom * (widthTo / widthFrom)); } else if (!widthTo && heightTo) { widthTo = Math.floor(widthFrom * (heightTo / heightFrom)); } else { return; } // allocate tiles into lines each(tileEls, function(i, tileEl) { // works only if first tile in line is higher or equal to others! var tile = tileEl.tile || new Tile(tileEl), nextTile = new Tile(tileEls[i + 1]); line.height = Math.max(line.height, tile.height); if (widthFrom - widthTaken >= tile.width / 2) { // tile is next to the right in the line widthTaken += tile.width + (tile.lastColumn ? 0 : marginFrom); heightTaken = tile.height; tile.x = line.x; tile.y = line.y = 0; line.tiles.push(tile); if (tile.lastColumn) { if (!nextTile || !(nextTile.lastColumn && line.height - heightTaken >= nextTile.height / 2)) { // last tile in line line = new Line(); } } else { line.x++; } } else if (tile.lastColumn && line.height - heightTaken >= tile.height / 2) { // vertically stacked tile heightTaken += tile.height + marginFrom; tile.x = line.x; tile.y = ++line.y; line.tiles.push(tile); if (tile.lastRow || !nextTile || !(nextTile.lastColumn && line.height - heightTaken >= nextTile.height / 2)) { line.height = Math.max(line.height, heightTaken); line = new Line(); } } }); // resize tiles each(lines, function(i, line) { var widthTaken = 0, heightTaken = 0, scaleX = (widthTo - (marginFrom * line.x)) / (widthFrom - (marginFrom * line.x)), scaleY = (heightTo - (marginFrom * line.y)) / (heightFrom - (marginFrom * line.y)), lineHeightTo = lines.length - 1 == i ? heightTo - heightToTaken : Math.floor(line.height * scaleY), tileWidthTo = 0, tileHeightTo = 0; heightToTaken += lineHeightTo + marginFrom; each(line.tiles, function(i, tile) { if (tile.x < line.x) { // not one tile width line tileWidthTo = Math.floor(tile.width * scaleX); widthTaken += tileWidthTo + marginFrom; if (!tile.y) { // one tile height line tileHeightTo = lineHeightTo; } } else if (tile.lastColumn) { // right edge tile tileWidthTo = widthTo - widthTaken; if (tile.y == line.y) { // bottom right corner tile tileHeightTo = lineHeightTo - heightTaken; } else { tileHeightTo = Math.floor(tile.height * scaleY); heightTaken += tileHeightTo + marginFrom; } } setStyle(tile.el, { width: tileWidthTo, height: tileHeightTo }); }); }); setStyle(meshEl, { width: widthTo, height: heightTo }); return [widthTo, heightTo]; }, resizePostAlbumWrap: function(albumEl, widthTo, marginFrom, prefix) { var widthFrom = positive(albumEl.style.width), thumbEl = geByClass1('page'+prefix+'_album_thumb_wrap', albumEl, 'div'), sideMeshEl = domFC(geByClass1('page'+prefix+'_album_photos', albumEl, 'div')), bottomMeshEl = domFC(geByClass1('page'+prefix+'_album_under_row', albumEl, 'div')) scaleX = widthTo / widthFrom; if (widthFrom < widthTo) return; // decrase width only if (!thumbEl) return; // not supported setStyle(albumEl, {width: widthTo}); var thumbWidthTo = Math.round(positive(thumbEl.style.width) * scaleX), thumbHeightTo = Math.round(positive(thumbEl.style.height) * scaleX) setStyle(thumbEl, { width: thumbWidthTo, height: thumbHeightTo }); sideMeshEl && WComments.resizePostSizedThumbs( sideMeshEl, widthTo - marginFrom - thumbWidthTo, marginFrom, thumbHeightTo ); bottomMeshEl && WComments.resizePostSizedThumbs( bottomMeshEl, widthTo, marginFrom, positive(bottomMeshEl.style.height) * ((widthTo - marginFrom) / (widthFrom - marginFrom)) ); }, resizePost: function(postEl, isReply) { var widthTo = isReply ? cur.options.reply_max_w : cur.options.max_w, heightTo = Math.max(cur.options.kludges_min_h, widthTo * (isReply ? cur.options.reply_kludges_ratio : cur.options.kludges_ratio)); each(geByClass('page_album_wrap', postEl, 'div'), function(i, albumEl) { WComments.resizePostAlbumWrap(albumEl, widthTo, 5); }); each(geByClass('page_market_album_wrap', postEl, 'div'), function(i, albumEl) { WComments.resizePostAlbumWrap(albumEl, widthTo - 2, 2, '_market'); }); each(geByClass('page_post_sized_thumbs', postEl, 'div'), function(i, meshEl) { WComments.resizePostSizedThumbs(meshEl, widthTo, 5, heightTo); }); return postEl; }, /* Events */ eventsQueue: [], eventsPaused: false, eventsPause: function() { this.eventsPaused = true; }, eventsProceed: function() { this.eventsPaused = false; while(this.eventsQueue.length) this.eventsParse(this.eventsQueue.shift()); }, eventsUpdateAttaches: function(el) { each(geByClass('audio_row', el, 'div'), function(i, e) { addClass(e, 'audio_no_actions'); }); }, eventsParse: function (ev_text) { if (this.eventsPaused) return this.eventsQueue.push(ev_text); var ev = ev_text.split(''), ev_ver = ev[0], ev_type = ev[1], post_id = ev[2], el = ge('post' + post_id); if (ev_ver != cur.options.qversion) return location.reload(); switch (ev_type) { case 'new_post': if (el) break; var cont = ge('wcomments_posts'), flgs = intval(ev[ev.length - 1]), newEl = this.resizePost(se(Wall.getNewPostHTML(ev, cur.options.is_admin))); WComments.eventsUpdateAttaches(newEl); function addPost() { cont.insertBefore(newEl, cont.firstChild); if (ge('post_poll_id' + post_id)) { Wall.updatePoll(post_id); } } if (cur.saveScrollPosition) { cur.scrollbar.updateAbove(addPost); } else { addPost(); cur.scrollbar && cur.scrollbar.scrollTop(0, true); } nodeUpdated(newEl); Wall.updateMentionsIndex(); if (cur.section !== 'browse') val(cur.countEl, newCnt ? getLang('widgets_comments_top_count', newCnt) : getLang('widgets_comments')); break; case 'del_post': if (el) { !cur.wallMyDeleted[post_id] && hide(el); cur.options.offset--; } break; case 'res_post': el && cur.options.offset++; break; case 'new_reply': if (!el || cur.wallMyReplied[post_id] || ge('post' + ev[3])) break; var repliesEl = ge('replies' + post_id), newEl = this.resizePost(se(Wall.getNewReplyHTML(ev, cur.options.is_admin)), true), highlight = false; if (isVisible('reply_link' + post_id)) { re('reply_link' + post_id); show('replies_wrap' + post_id); highlight = true; } else { var openEl = repliesEl.nextSibling, newCnt = geByClass('new_reply', repliesEl, 'div').length + 1; if (cur.wallMyOpened[post_id]) { openEl && openEl.className == 'replies_open' && re(openEl); highlight = true; var headerEl = geByClass1('wr_header', repliesEl, 'a'), shown = geByClass('reply', repliesEl, 'div').length + 1, total = shown; if (headerEl) total = intval(headerEl.getAttribute('offs').split('/')[1]) + 1; if (total > 5 || shown < total) { if (!headerEl) { headerEl = ce('a', {className: 'wr_header'}); repliesEl.insertBefore(headerEl, repliesEl.firstChild); } Wall.updateRepliesHeader(post_id, headerEl, shown, total); } } else { addClass(newEl, 'new_reply'); if (!openEl || openEl.className != 'replies_open') { openEl = ce('div', {className: 'replies_open', onclick: Wall.openNewComments.pbind(post_id)}); repliesEl.parentNode.insertBefore(openEl, repliesEl.nextSibling); } val(openEl, getLang('news_x_new_replies_more', Math.min(100, newCnt))); openEl.newCnt = newCnt; } } WComments.eventsUpdateAttaches(newEl); repliesEl.appendChild(newEl); highlight && nodeUpdated(newEl); break; case 'del_reply': !cur.wallMyDeleted[post_id] && re(el); break; } this.resizeWidget(); }, override: function(file, force) { if (!StaticFiles[file] && force !== true) return; switch (file) { case 'lite.js': extend(window, { showTooltip: Widgets.showTooltip, showBox: Widgets.showBox({ 'al_photos.php': {'photo_box': true, 'choose_photo': true}, 'al_video.php': {'video_box': true, 'a_choose_video_box': true}, 'al_places.php': {'show_photo_place': true}, 'like.php': {'publish_box': true}, 'widget_like.php': {'a_stats_box': true}, 'widget_post.php': {'subscribed_box': true, 'audio_claim_warning': true}, 'al_wall.php': {'canvas_draw_box': true}, 'al_im.php': {'stickers_store': true, 'sticker_preview': true}, 'al_audio.php': {'a_choose_audio_box': {stat: ['audioplayer.css', 'audioplayer.js']}} }), showCaptchaBox: Widgets.showCaptchaBox, showReCaptchaBox: Widgets.showReCaptchaBox, gotSession: function(session_data) { location.reload(); }, showPhoto: Widgets.showPhoto, showVideo: Widgets.showVideo, showWiki: function(likeInfo) { likeInfo = (likeInfo && likeInfo['w'] || '').split('/'); if (likeInfo[0] == 'likes') { WComments.showLikesBox(likeInfo[1]); } else if (likeInfo[0] == 'shares') { WComments.showLikesBox(likeInfo[1], {tab: 'published'}); } else { return true; } }, mentionOver: function() { return true; }, mentionClick: function() { return true; }, showInlineVideo: Widgets.showInlineVideo, revertLastInlineVideo: Widgets.revertLastInlineVideo, pauseLastInlineVideo: Widgets.pauseLastInlineVideo }); break; case 'emoji.js': extend(Emoji, { focus: function(cont, shouldScroll) { Emoji.editableFocus(cont, false, true); if (shouldScroll && cur.scrollbar) { var el = domCA(cont, '.reply_box'); el && cur.scrollbar.scrollIntoView(el); } } }); break; case 'page.js': if (cur.options.is_auto || cur.options.is_nano) { Composer.init = (function(init) { // wrap with extended media options return function() { var args = [].slice.call(arguments); if (args[1].media) args[1].media.options = extend(args[1].media.options || {}, { hideAfterCount: 0, maxShown: 0, forceToUp: 1 }); return init.apply(Wall, args); } })(Composer.init); } extend(Wall, { scrollHighlightReply: function(el) { if (!(el = ge(el))) return; if (cur.options.fixed_height && cur.scrollbar) { cur.scrollbar.scrollIntoView(el, true, Wall.highlightReply.bind(Wall, el)); } else { el.scrollIntoView(); Wall.highlightReply(el); } }, postTooltip: (function(postTooltip) { // wrap with additional opts return function() { var args = [].slice.call(arguments); args[3] = extend(args[3] || {}, { appendEl: cur.postsOuterEl }); return postTooltip.apply(this, args); } })(Wall.postTooltip), sendPost: function() { if (!cur.sendPostBtn) return; var addmedia = cur.wallAddMedia || {}, media = addmedia.chosenMedia || {}, medias = cur.wallAddMedia ? addmedia.getMedias() : [], share = (addmedia.shareData || {}) msg = trim((window.Emoji ? Emoji.editableVal : val)(ge('post_field'))), postponePost = false; var pType = cur.options.suggesting ? 'suggest' : cur.wallType, params = { act: 'post', message: msg, to_id: cur.postTo, type: pType, status_export: '', widget_app: cur.options.app, widget_page_url: cur.options.page_url, widget_page_title: cur.options.page_title, widget_page_desc: cur.options.page_desc, widget_page_query: cur.options.page_query, hash: cur.options.post_hash }, ownmsg = (cur.postTo == vk.id || params.official || cur.options.only_official), attachI = 0; if (isArray(media) && media.length) { medias.push(clone(media)); } if (medias.length) { var ret = false; each (medias, function (k, v) { if (!v) return; var type = this[0], attachVal = this[1]; switch (type) { case 'poll': var poll = addmedia.pollData(); if (!poll) { ret = true; return false; } attachVal = poll.media; delete poll.media; params = extend(params, poll); break; case 'share': if (share.failed || !share.url || !share.title && (!share.images || !share.images.length) && !share.photo_url) { if (cur.shareLastParseSubmitted && vkNow() - cur.shareLastParseSubmitted < 2000) { ret = true; return false; } else { return; } } attachVal = (!share.noPhoto && share.user_id && share.photo_id) ? share.user_id + '_' + share.photo_id : ''; if (share.images && share.images.length && !share.share_own_image) { addmedia.uploadShare(Wall.sendPost); ret = true; return false; } if (share.initialPattern && (trim(msg) == share.initialPattern)) { params.message = ''; } params = extend(params, { url: share.url, title: replaceEntities(share.title), description: replaceEntities(share.description), extra: share.extra, extra_data: share.extraData, mode: share.mode, photo_url: share.noPhoto ? '' : replaceEntities(share.photo_url), open_graph_data: (share.openGraph || {}).data, open_graph_hash: (share.openGraph || {}).hash }); break; case 'page': if (share.initialPattern && (trim(msg) == share.initialPattern)) { params.message = ''; } break; case 'postpone': var ts = val('postpone_date' + addmedia.lnkId); params = extend(params, {postpone: ts}); cur.postponedLastDate = ts; postponePost = true; return; } if (this[3] && trim(msg) == this[3]) { params.message = ''; } params['attach' + (attachI + 1) + '_type'] = type; params['attach' + (attachI + 1)] = attachVal; attachI++; }); if (ret) { return; } } if (!attachI && !msg) { elfocus('post_field'); return; } var sendBtn = ge('send_post'); if (sendBtn && buttonLocked(sendBtn)) { return; } if (cur.postAutosave) { clearTimeout(cur.postAutosave); } hide('submit_post_error'); cur.postSent = true; setTimeout(function() { WComments.eventsPause(); ajax.post('al_wall.php', Wall.fixPostParams(params), { onDone: function(post_id) { if (post_id) { var params = { act: 'a_post', post: post_id, width: cur.options.width, hash: cur.options.post_hash, app: cur.options.app, limit: cur.options.limit, 'export': isChecked('wcomments_export') }; ajax.post('al_widget_comments.php', params, { onDone: function (options, rows) { if (cur.section == 'posts' && cur.Rpc) { cur.Rpc.callMethod('publish', 'widgets.comments.new_comment', options.count, options.last_comment, options.date, options.full_hash, options.pageId); } val('wcomments_posts', rows); WComments.contentUpdated(options); Wall.updateMentionsIndex(); WComments.eventsProceed(); }, onFail: function() { WComments.eventsProceed(); }, showProgress: function() { lockButton(ge('send_post')); }, hideProgress: function() { Wall.clearInput(); cur.postSent = false; var rf = ge('post_field'); if (cur.withMentions) { var mention = data(rf, 'mention'); if (mention) { mention.rtaEl.innerHTML = ''; hide(mention.cont); show(rf); } } rf.value = ''; rf.blur(); rf.phonblur(); Wall.hideEditPost(true); if (cur.wallAddMedia) cur.wallAddMedia.unchooseMedia(); hide('post_warn'); if (cur.onWallSendPost) { cur.onWallSendPost(); } unlockButton(ge('send_post')); } }); } }, onFail: function(msg) { cur.postSent = false; if (!msg) { return true; } ge('submit_post_error').innerHTML = (msg.length > 60 ? '
' + msg + '
' : msg); if (!isVisible('submit_post_error')) { slideDown('submit_post_error', 100); } return true; }, showProgress: function() { lockButton(sendBtn); }, hideProgress: function() { unlockButton(sendBtn); } }); }, 0); }, sendReply: function(post, ev, options) { options = extend({}, options); if (window.mvcur && mvcur.post == post) { return Videoview.sendComment(post, ev, options.stickerId); } var wallLayer = (window.cur.wallLayer == post), cur = wallLayer ? wkcur : window.cur, rf = ge('reply_field' + post), composer = rf && data(rf, 'composer'), replyName = cur.reply_to && Wall.getReplyName(cur.reply_to[0]), state; var _send = rf && data(rf, 'send'); if (_send && isFunction(_send)) { return _send(post, ev, options); } if (options.stickerId) { var params = {message: '', attach1_type: "sticker", attach1: options.stickerId, sticker_referrer: options.sticker_referrer}; } else { var params = composer ? Composer.getSendParams(composer, Wall.sendReply.pbind(post)) : {message: trim(Emoji.editableVal(rf))}; if (params.delayed) { return; } if (!params.attach1_type) { if (!params.message || isArray(replyName) && !replyName[1].indexOf(params.message)) { Emoji.editableFocus(ge('reply_field' + post), false, true); return; } } if (composer) { state = Composer.reset(composer); } else if (window.Emoji) { Emoji.val(rf, ''); } if (rf.autosize) { rf.autosize.update(); } } cur.wallMyOpened = cur.wallMyOpened || {}; cur.wallMyReplied[post] = 1; cur.wallMyOpened[post] = 1; var post_hash = ge('post_hash' + post) ? ge('post_hash' + post).value : cur.options.post_hash, fromGroupEl = ge('reply_as_group' + post), newEl = null; extend(params, { act: 'post', type: 'widget', width: cur.options.width, reply_to: post, reply_to_msg: val('reply_to' + post), reply_to_user: cur.reply_to && cur.reply_to[0] || 0, start_id: val('start_reply' + post), from: 'widget', hash: post_hash }); if (cur.reverse) { params.rev = 1; } if (browser.mobile) { Wall.hideEditReply(post); } else { Emoji.editableFocus(rf, false, true); Wall.cancelReplyTo(post, ev); } ajax.post('al_wall.php', Wall.fixPostParams(params), { onDone: function(reply, replies, names, data) { if (cur.wallType == 'full') { return FullWall.onReplySent.apply(window, arguments); } cur.wallMyReplied[post] = 0; re('reply_link' + post); hide('reply_warn' + post); Wall._repliesLoaded(post, false, replies, names, data); }, onFail: function () { newEl && re(newEl); if (composer) { state = Composer.restore(composer, state); } else { val(rf, params.message); } if (rf.autosize) rf.autosize.update(); }, showProgress: lockButton.pbind(ge('reply_button' + post)), hideProgress: unlockButton.pbind(ge('reply_button' + post)) }); if (params.from_group || !params.message) return; var repliesEl = ge('replies' + post), replyId = -(++cur.wallMyRepliesCnt); var message = Emoji.emojiToHTML(clean(params.message), true), toName = params.reply_to_user < 0 ? getLang('wall_replied_to_group') : cur.options.reply_names[params.reply_to_user] && cur.options.reply_names[params.reply_to_user][0], toLnk = toName ? rs(cur.wallTpl.reply_link_to, {to_user: toName}) : ''; newEl = se(rs(cur.wallTpl.reply_fast, { reply_id: '0_' + replyId, message: message.replace(/\n/g, '
'), to_link: toLnk, date: Wall.getNowRelTime(cur) })); if (repliesEl && !isVisible(repliesEl) || ge('reply_link' + post)) { re('reply_link' + post); show('replies_wrap' + post); } else if (!cur.onepost) { var openEl = repliesEl.nextSibling; if (openEl && openEl.className == 'replies_open') { Wall.openNewComments(post); } if (!wallLayer) { var headerEl = geByClass1('wr_header', repliesEl, 'a'), shown = geByClass('reply', repliesEl, 'div').length + 1, total = shown; if (headerEl) { total = intval(headerEl.getAttribute('offs').split('/')[1]) + 1; } if (total > 5 || shown < total) { if (!headerEl) { repliesEl.insertBefore(headerEl = ce('a', {className: 'wr_header'}), repliesEl.firstChild); } Wall.updateRepliesHeader(post, headerEl, shown, total); } } } if (cur.reverse) { repliesEl.insertBefore(newEl, repliesEl.firstChild); } else { repliesEl.appendChild(newEl); } }, deletePost: function(el, post, hash, root, force) { (cur.wallLayer ? wkcur : cur).wallMyDeleted[post] = 1; var r = ge('post' + post), actionsWrap = geByClass1('post_actions', r); ajax.post('al_wall.php', { act: 'delete', post: post, hash: hash, root: root ? 1 : 0, confirm: force ? 1 : 0, from: 'widget' }, { onDone: function(msg, res, need_confirm) { if (need_confirm) { var box = showFastBox(msg, need_confirm, getLang('global_delete'), function() { box.hide(); wall.deletePost(post, hash, root, 1); }, getLang('box_cancel')); return; } if (res && cur.section == 'posts' && cur.Rpc) { cur.Rpc.callMethod('publish', 'widgets.comments.delete_comment', res.count, res.last_comment, res.date, res.full_hash, res.pageId); } var t = geByClass1('_post_content', r) || geByClass1('feedback_row_t', r); revertLastInlineVideo(t); var pd = ge('post_del' + post); if (pd) { pd.innerHTML = '' + msg + ''; show(pd); } else { r.appendChild(ce('div', {id: 'post_del' + post, className: 'dld', innerHTML: '' + msg + ''})); } hide(t); if (domNS(t).className == 'post_publish') hide(domNS(t)); if (cur.wallType == 'full_own' || cur.wallType == 'full_all') { Pagination.recache(-1); FullWall.updateSummary(cur.pgCount); } else if (cur.wallType == 'full') { if (hasClass(r, 'reply')) { cur.pgOffset--; cur.pgCount--; FullWall.repliesSummary(cur.pgCount); } } if (hasClass(r, 'suggest')) { Wall.suggestUpdate(-1); } else if (hasClass(r, 'postponed')) { } else if (cur.wallType == 'own' || cur.wallType == 'all') { if (hasClass(r, 'own')) ++cur.deletedCnts.own; if (hasClass(r, 'all')) ++cur.deletedCnts.all; Wall.update(); } WComments.contentUpdated(); }, showProgress: function() { if (hasClass(el, 'ui_actions_menu_item')) { lockActionsMenuItem(el); } else if (hasClass(el, 'flat_button')) { lockButton(el); } else { addClass(actionsWrap, 'post_actions_progress'); } }, hideProgress: function() { if (hasClass(el, 'ui_actions_menu_item')) { unlockActionsMenuItem(el); } else if (hasClass(el, 'flat_button')) { unlockButton(el); } else { removeClass(actionsWrap, 'post_actions_progress'); } } }); var btn = ge('delete_post' + post), myReply; if (btn && btn.tt && btn.tt.el) { btn.tt.destroy(); } }, restorePost: function(post, hash, root) { (cur.wallLayer ? wkcur : cur).wallMyDeleted[post] = 0; ajax.post('al_wall.php', { act: 'restore', post: post, hash: hash, root: root ? 1 : 0, from: 'widget' }, { onDone: function(msg) { var pd = ge('post_del' + post); if (!pd) return; var r = ge('post' + post), t = geByClass1('_post_content', r) || geByClass1('feedback_row_t', r); show(t); if (domNS(t).className == 'post_publish') show(domNS(t)); hide(pd); if (cur.wallType == 'full_own' || cur.wallType == 'full_all') { Pagination.recache(1); FullWall.updateSummary(cur.pgCount); } else if (cur.wallType == 'full') { if (hasClass(r, 'reply')) { cur.pgOffset++; cur.pgCount++; FullWall.repliesSummary(cur.pgCount); } } if (hasClass(r, 'suggest')) { Wall.suggestUpdate(1); } else if (hasClass(r, 'postponed')) { } else if (cur.wallType == 'own' || cur.wallType == 'all') { if (hasClass(r, 'own')) --cur.deletedCnts.own; if (hasClass(r, 'all')) --cur.deletedCnts.all; Wall.update(); } WComments.contentUpdated(); } }); return false; }, postClick: function (post, event, opts) { var matches = (post || '').match(/^(-?\d+)_(wall)?(\d+)$/), el = ge('post' + post); if (opts && opts.skipCheck) { var clickEl = true; } else { var clickEl = Wall.checkPostClick(el, event); } if (!clickEl) return; if (clickEl !== true) { var moreLink = geByClass1('wall_post_more', clickEl, 'a'); if (moreLink && isVisible(moreLink)) { moreLink.onclick(); if (!matches) removeClass(el, 'wall_post_over'); return; } } if (!matches) return; if (hasClass(ge('wcomments_posts'), 'no_post_click')) return; window.open('wall' + matches[1] + '_' + matches[3], '_blank'); }, _repliesLoaded: function(post, hl, replies, names) { var r = ge('replies' + post); if (!r) return; // fixme: shortcut solution that prevents js error when clicking on name of replied person in comments if (hl) { var el = browser.msie6 ? pageNode : ((browser.chrome || browser.safari) ? bodyNode : htmlNode); var h = r.offsetHeight; if (cur.options.fixed_height && cur.scrollbar) { cur.scrollbar.updateAbove(function() { r.innerHTML = replies; }); } else { r.innerHTML = replies; } setTimeout(Wall.scrollHighlightReply.pbind('post' + hl), 0); } else { r.innerHTML = replies; } var openEl = r.nextSibling; if (openEl && openEl.className == 'replies_open') { re(openEl); } extend(cur.options.reply_names || {}, names); Wall.updateMentionsIndex(); }, editPost: (function(editPost) { // wrap with audioplayer preload return function(el, post) { stManager.add(['audioplayer.css', 'audioplayer.js'], Function.apply.bind(editPost, Wall, [].slice.call(arguments))); } })(Wall.editPost), checkTextLen: function() {}, checkPostLen: function() {}, replySubmitTooltip: function() {}, repliesSideSetup: function() {}, repliesSideClick: function() {}, pollFull: function() {}, likesShow: function(el, post_id, opts) { opts = opts || {}; var p = wall.parsePostId(post_id), like_type = p.type, post_raw = p.id, like_obj = like_type + post_raw, postEl = el && gpeByClass('_post_content', el) || wall.domPost(post_raw), wrapClass = opts.share ? '_share_wrap' : '_like_wrap', wrapEl = domByClass(postEl, wrapClass), iconEl = domByClass(wrapEl, '_icon'), hasShare = postEl && domByClass(postEl, '_share_wrap'); if (!iconEl || cur.viewAsBox) return; var tt_offset = 56, wrap_left = getXY(wrapEl)[0], icon_left = getXY(iconEl)[0], icon_width = getSize(iconEl, true)[0], left_offset = icon_left + icon_width / 2 - wrap_left - tt_offset; showTooltip(iconEl.parentNode, { url: '/like.php', params: extend({act: 'a_get_stats', 'object': like_obj, has_share: hasShare ? 1 : ''}, opts.share ? {published: 1} : {}), slide: 15, shift: [-left_offset, -3], ajaxdt: 100, showdt: 400, hidedt: 200, dir: 'auto', checkLeft: true, reverseOffset: 80, appendEl: ge('page_wrap'), tip: { over: function() { Wall.likesShow(el, post_id, opts); } }, typeClass: 'like_tt wcomments_like_tt', className: opts.cl || '' }); }, showReplies: function(post, count, hl, ev) { if (checkEvent(ev || window.event)) return; if (cur.viewAsBox) return cur.viewAsBox(); cur.wallMyOpened[post] = count != 3; ajax.post('al_wall.php', { act: 'get_replies', width: cur.options.width, post: post, count: count, from: 'widget' }, { onDone: function() { var args = [].slice.call(arguments); args.unshift(post, hl); Wall._repliesLoaded.apply(Wall, args); WComments.resizeWidget(); }, showProgress: lockButton.pbind('wrh' + post), hideProgress: unlockButton.pbind('wrh' + post) }); return false; } }); // wrap with authorization demand each(['showEditReply', 'markAsSpam', 'stickerClick', 'likeIt'], function(k, v) { Wall[v] = (function(func) { return function() { if (!vk.id) { Widgets.auth(); } else { return func.apply(Wall, [].slice.call(arguments)); } } })(Wall[v]); }); break; case 'ui_media_selector.js': window.MediaSelector = function(lnk, previewId, mediaTypes, opts) { var types = [], addMedia; opts = opts || {}; var customMediaHandlers = opts.mediaHandlers || {}; each(mediaTypes || [], function (i, v) { var type = v[0], label = v[1], data = v[2]; if (!label) return; var handler = false, params = {to_id: cur.postTo, scrollbar_width: sbWidth()}; params.mail_add = opts.mail ? 1 : ''; switch (type) { case 'graffiti': handler = showBox.pbind('al_wall.php', {to_id: cur.postTo, act: 'canvas_draw_box', flash: browser.flash}, {cache: 1, dark: 1}); break; case 'photo': handler = showBox.pbind('al_photos.php', {to_id: cur.postTo, act: 'choose_photo', max_files: opts.limit || 10}, {cache: 1, stat: ['photos.js', 'photos.css', 'upload.js'], dark: 1}); break; case 'video': handler = showBox.pbind('al_video.php', {to_id: cur.postTo, act: 'a_choose_video_box'}, {cache: 1, dark: 1}); break; case 'audio': handler = showBox.pbind('al_audio.php', {to_id: cur.postTo, act: 'a_choose_audio_box'}, {cache: 1, dark: 1}); break; default: topError('Unknown type: ' + type); } types.push([type, label, handler]); }); var limit = opts.limit || 10, multi = limit > 1, editable = opts.editable && (!browser.msie || browser.version > 8), sortable = opts.sortable && (!browser.msie || browser.version > 8); var menu = initSelector(lnk, types, { onActivate: function () { cur.chooseMedia = addMedia.chooseMedia; cur.showMediaProgress = addMedia.showMediaProgress; cur.attachCount = addMedia.attachCount; cur.lastAddMedia = addMedia; }, onItemClick: function(type) { if (multi && addMedia.attachCount() >= limit && type !== 'postpone' && type !== 'mark_as_ads') { showBox('blank.php', {code: 1900, limit: limit}); return false; } return true; }, hideAfterCount: opts.hideAfterCount, topOffset: opts.topOffset, forceUp: opts.forceUp, global: opts.global, maxShown: opts.maxShown, forceToUp: opts.forceToUp }); if (!menu) return; previewId = previewId || 'media_preview'; var lnkId = clean(menu.id), previewEl = ge(previewId), progressEl; if (multi) { previewEl.innerHTML = '
'; var picsEl = domFC(previewEl), dpicsEl = domNS(picsEl), docsEl = domNS(dpicsEl), pdocsEl = domNS(docsEl), ldocsEl = domNS(pdocsEl), mpicsEl = domNS(ldocsEl), ppdocsEl = domNS(mpicsEl), progressEl = domNS(ppdocsEl); removeClass(previewEl, 'media_preview'); addClass(previewEl, 'multi_media_preview'); } else { addClass(previewEl, 'med_no_attach'); show(previewEl); } addMedia = { _addMediaLink: lnk, lnkId: lnkId, menu: menu, types: types, phLists: {}, handlers: {}, chosenMedias: [], _showAddMedia: function() { menu.show(); }, _hideAddMedia: function(noTimeout) { menu.hide(noTimeout); }, chooseMedia: function(type, media, data, url, noboxhide, isGraffiti) { if (addMedia.onChange && addMedia.onChange(type, media, data, url) === false) { if (data.upload_ind !== undefined) re('upload' + data.upload_ind + '_progress_wrap'); return false; } if (inArray(type, opts.disabledTypes || [])) { return false; } if (addMedia.attachCount() >= limit && data.upload_ind === undefined && type !== 'postpone' && type !== 'mark_as_ads' || geByClass1('medadd_c_market', docsEl)) { if (multi) { return false; } else { addMedia.unchooseMedia(); } } var already = false, alreadyTypes = {}; if (multi) { each (addMedia.chosenMedias, function () { if (this[0] == type && this[1] == media) { already = true; return false; } alreadyTypes[this[0]] = alreadyTypes[this[0]] ? alreadyTypes[this[0]] + 1 : 1; }); if (already) { return false; } } var preview = '', postview = '', wrap_class = '', toPics = false, toEl = docsEl, oncl, attrs = ''; switch (type) { case 'graffiti': if (!isObject(data)) { data = {thumb: data || ''}; } preview = '
'; toEl = toPics = mpicsEl; break; case 'photo': if (!isObject(data)) { data = { thumb_m: data[0] || '', thumb_s: data[1] || '', list: data[2] || '', view_opts: data[3] || '', upload_ind: data.upload_ind || undefined }; } vkImage().src = data.thumb_m; var _vopts = data.view_opts.replace(/^{|}$/g, ''); if (_vopts) _vopts += ','; _vopts += '"queue":1'; _vopts = '{' + _vopts + '}'; if (editable) { if (!data.editable) return false; if (!opts.nocl) { fastXDM.getJSON(function(json) { data.editable.click = showPhoto.pbind(media, data.list, json.parse(_vopts.replace(/"/g, '"'))); }); } } oncl = opts.nocl ? '' : ' onclick="return showPhoto(\'' + clean(media) + '\', \'' + data.list + '\', {' + _vopts.replace(/"/g, '"') + '});"'; preview = '
'; toPics = 1; toEl = picsEl; break; case 'video': if (!isObject(data)) { data = { thumb: data || '' }; } if (editable) { if (!data.editable) return false; if (!opts.nocl) data.editable.click = showVideo.pbind(media, false, {queue:1}); } oncl = opts.nocl ? '' : ' onclick="return showVideo(\'' + clean(media) + '\', false, {queue:1});"'; preview = ''; toPics = 1; toEl = picsEl; break; case 'audio': if (!data.info) return false; var mediaRowEl = geByClass1('_audio_row_' + media); if (mediaRowEl) { data = AudioUtils.getAudioFromEl(mediaRowEl); } preview = Page.addAudioPreview(clean(media), data); attrs = ' id="pam' + clean(lnkId) + '_audio' + clean(media) + '"'; break; case 'share': if (alreadyTypes.share || alreadyTypes.page || !data.lang) { return false; } if (isArray(data)) { data = { domain: data[0], url: data[1], initialPattern: data[2], title: data[3], description: data[4], images: [data[5]], user_id: data[6], photo_id: data[7] }; }; data.media = data.media || media; preview = '' + clean(data.lang.profile_choose_link) + ''; addMedia.shareData = extend(addMedia.shareData || {}, data, {imagesStyles: ['']}); toEl = ldocsEl; break; case 'poll': if (!data.lang) return false; preview = '
' + clean(data.lang.q) + '
'; hide(domByClass(menu.menuNode, '_type_poll')); toEl = pdocsEl; break; case 'album': if (data.thumb.match(/^\/images\//)) { data.thumb = ''; } if (editable) { if (!data.editable) return false; extend(data.editable, { title: data.title, size: data.count, click: opts.nocl ? false : nav.change.pbind({z: 'album' + media}) }); } var thumb = data.thumb; vkImage().src = thumb; oncl = opts.nocl ? '' : ' href="/album' + clean(media) + '" onclick="return nav.change({z: \'album' + clean(media) + '\'}, event)"'; var cls = 'fl_l page_album_link' + (thumb ? '' : ' page_album_nocover'); preview = '\ ' + (thumb ? '
' : '') + '\
\
' + clean(data.count) + '
\
' + clean(data.title) + '
\
\
'; toPics = 1; toEl = picsEl; break; default: topError('Unknown type: ' + type); } if (multi) { var medias = addMedia.chosenMedias, ind = medias.length, mediaEl = (editable && toPics === 1) ? false : ((type == 'photos_list') ? se('
' + preview + '
' + media.split(',').length + '
') : se('
' + preview + '
' + postview + '
')); addClass(mediaEl, toPics ? 'fl_l' : 'clear_fix'); if (data.upload_ind !== undefined) re('upload' + data.upload_ind + '_progress_wrap'); if (opts.toggleLnk) toggle(lnk, addMedia.attachCount() + 1 < limit); if (editable && toPics === 1) { addClass(toEl, 'editable_thumbs_wrap'); if (!domLC(toEl) || !hasClass(domLC(toEl), 'editable_thumbs')) { toEl = toEl.appendChild(ce('div', {id: 'thumbs_edit' + lnkId, className: 'editable_thumbs'})); } else { toEl = domLC(toEl); } stManager.add(['thumbs_edit.css', 'thumbs_edit.js'], function() { if (opts.toggleLnk) toggle(lnk, addMedia.attachCount() + 1 < limit); data.editable.remove = addMedia.unchooseMedia.pbind(ind); show(domPN(toEl)); var teMed = ThumbsEdit.convert(type, media, data.editable, data.peEditable); if (domFC(toEl)) { ThumbsEdit.addMedia(toEl, teMed, data); } else if (opts.teWidth && opts.teHeight) { ThumbsEdit.init(toEl, [teMed], {width: opts.teWidth, height: opts.teHeight, force: true, onMove: opts.onAddMediaChange, onUpdate: opts.onChangedSize}); } else { ThumbsEdit.init(toEl, [teMed], {onMove: opts.onAddMediaChange, force: true, onUpdate: opts.onChangedSize}); } toggleClass(previewEl, 'media_preview_has_medias', addMedia.hasVisibleRows()); opts.onChangedSize && opts.onChangedSize() }, true); } else { show(toEl); toEl.appendChild(mediaEl); if (sortable) { if (toEl == docsEl) { stManager.add(['sorter.js'], function() { var dXY = getXY(docsEl), dSz = getSize(docsEl), docsSorter = function() { if (docsEl.sorter) { sorter.added(docsEl); } else if (toEl.childNodes.length > 1) { sorter.init(docsEl, {onReorder: opts.onAddMediaChange}); } }; if (!dXY[0] && !dXY[1] && !dSz[0] && !dSz[1]) { cur.sorterClbk = docsSorter; } else { docsSorter(); } opts.onChangedSize && opts.onChangedSize() }, true); } else if (toEl == dpicsEl) { stManager.add(['qsorter.js'], function() { if (dpicsEl.qsorter) { qsorter.added(dpicsEl); } else if (toEl.childNodes.length > 1) { qsorter.init(dpicsEl, addMedia.qsorterOpts()); } opts.onChangedSize && opts.onChangedSize() }, true); } } opts.onChangedSize && opts.onChangedSize(); } medias.push([type, media, mediaEl, url]); } else { var ind = 0; if (type === 'postpone') { ind = 1; } else if (type === 'mark_as_ads') { ind = 2; } var mediaEl = se('
' + preview + '
' + postview + '
'); addClass(mediaEl, toPics ? 'fl_l' : 'clear_fix'); if (data.upload_ind !== undefined) re('upload' + data.upload_ind + '_progress_wrap'); if (type !== 'postpone' && type !== 'mark_as_ads') { addMedia.chosenMedia = [type, media]; addMedia.chosenMediaData = data; } addMedia.singleAdded(mediaEl, type); } if (type == 'share') { if (data.title && !url) { cur.shareShowImg = 0; addMedia.showPreview(true); addMedia.shareData.images = false; } else { addMedia.showExternalPreview(); } } else if (type == 'page') { if (!data['nopreview']) { cur.shareShowImg = 0; addMedia.shareData = extend(addMedia.shareData || {}, data, {images: false}); addMedia.showPreview(); } } else if (type == 'poll') { addMedia.createPoll(data); } else if (type == 'postpone') { addMedia.setupPostpone(data, exp); } else if (type == 'mark_as_ads') { addMedia.markAsAds = 1; } toggleClass(previewEl, 'media_preview_has_medias', addMedia.hasVisibleRows()); opts.onChangedSize && opts.onChangedSize(); var ev = window.event; if (ev && ev.type == 'click' && (ev.ctrlKey || ev.metaKey || ev.shiftKey)) { noboxhide = true; } if ((!cur.fileApiUploadStarted || data.upload_ind === undefined) && !cur.preventBoxHide && noboxhide !== true && !inArray(type, ['poll', 'share', 'page', 'postpone', 'mark_as_ads'])) { boxQueue.hideLast(); } cur.lastPostMsg = false; if (opts.onMediaAdd) { opts.onMediaAdd(); } cur.onMediaChanged && cur.onMediaChanged(); if (data.upload_ind !== undefined) { delete data.upload_ind; } return false; }, unchooseMedia: function(ind) { if (addMedia.onChange && addMedia.onChange(false, ind) === false) { return false; } if (multi) { if (ind === undefined) { if (window.ThumbsEdit) { ThumbsEdit.removeAll('thumbs_edit' + lnkId); } each (addMedia.chosenMedias, function (k, v) { if (v && k !== undefined) addMedia.unchooseMedia(k); }); addMedia.urlsCancelled = []; return; } var medias = addMedia.chosenMedias, x; if (medias[ind]) { if (medias[ind][2]) { if ((x = geByClass1('page_media_x_wrap', medias[ind][2], 'div')) && x.tt && x.tt.el) { x.tt.destroy(); } if (domPN(medias[ind][2]) == docsEl && docsEl.sorter) { each (docsEl.sorter.elems, function() { setStyle(this, {top: 'auto', left: 'auto', cursor: 'auto'}); }); docsEl.sorter.destroy(); re(medias[ind][2]); if (docsEl.childNodes.length > 1) sorter.init(docsEl, {onReorder: opts.onAddMediaChange}); } else if (domPN(medias[ind][2]) == dpicsEl && dpicsEl.qsorter) { each (dpicsEl.qsorter.elems, function() { setStyle(domFC(this), {top: 'auto', left: 'auto'}); setStyle(this, {cursor: 'auto'}); }); dpicsEl.qsorter.destroy(); re(medias[ind][2]); if (dpicsEl.childNodes.length > 1) qsorter.init(dpicsEl, addMedia.qsorterOpts()); } else { re(medias[ind][2]); } } else if (medias[ind][0] == 'photo' || medias[ind][0] == 'video' || medias[ind][0] == 'album') { if (window.ThumbsEdit) { ThumbsEdit.removeById('thumbs_edit' + lnkId, medias[ind][0] + medias[ind][1]); } } switch (medias[ind][0]) { case 'page': case 'share': addMedia.shareData = {}; re(addMedia.sharePreview); hide('medadd_c_linkimg_loader'); clearTimeout(cur.showLoaderTimeout); clearInterval(cur.shareImgInterval); clearTimeout(cur.shareImgInterval2); clearTimeout(cur.imgLoadTimeout); delete addMedia.sharePreview; break; case 'poll': re(addMedia.pollPreview); addMedia.pollPreview = false; show(domByClass(menu.menuNode, '_type_poll')); break; case 'map': show(domByClass(menu.menuNode, '_type_map')); break; case 'market': show(lnk); break; case 'postpone': var exp = geByClass1('medadd_c_timersett', addMedia.postponePreview); if (cur.editingPost && exp) { re(domFC(addMedia.postponePreview)); } else { re(addMedia.postponePreview); } addMedia.postponePreview = false; removeClass('official', 'disabled'); if (!cur.editingPost) { ge('send_post').innerHTML = getLang('wall_send'); } else { ge('wpe_save').innerHTML = getLang('wall_publish_now'); } show(domByClass(menu.menuNode, '_type_postpone')); break; case 'mark_as_ads': show(domByClass(menu.menuNode, '_type_mark_as_ads')); break; } medias[ind] = false; } if (opts.toggleLnk) toggle(lnk, addMedia.attachCount() < limit); toggle(picsEl, !!(editable ? geByClass1('thumb_wrap', picsEl) : domFC(picsEl))); toggle(dpicsEl, !!domFC(dpicsEl)); toggle(docsEl, !!domFC(docsEl)); toggle(pdocsEl, !!domFC(pdocsEl)); toggle(ldocsEl, !!domFC(ldocsEl)); toggle(mpicsEl, !!domFC(mpicsEl)); toggle(ppdocsEl, !!domFC(ppdocsEl)); toggle(progressEl, !!domFC(progressEl)); } else { var share, x; if (ind == undefined) { ind = 0; } if ((x = geByClass('page_media_x_wrap', previewEl, 'div')[ind]) && x.tt && x.tt.el) { x.tt.destroy(); } if ((ind == 1) && addMedia.postponePreview) { show(geByClass1('add_media_type_' + lnkId + '_postpone', menu.menuNode, 'a')); var postponeWrap = domPN(addMedia.postponePreview); window.tooltips && tooltips.destroyAll(postponeWrap); re(postponeWrap); addMedia.postponePreview = false; var newTypes = menu.lastTypes; each(menu.types, function (i, v) { if (v[0] === 'postpone') { newTypes.push(v); } }); menu.setItems(newTypes); } else if ((ind == 2) && addMedia.markAsAds) { addMedia.markAsAds = false; var markAsAdsWrap = geByClass1('page_preview_mark_as_ads_wrap', previewEl); window.tooltips && markAsAdsWrap && tooltips.destroyAll(markAsAdsWrap); re(markAsAdsWrap); var newTypes = menu.lastTypes; each(menu.types, function (i, v) { if (v[0] === 'mark_as_ads') { newTypes.push(v); } }); menu.setItems(newTypes); } else { if (addMedia.postponePreview || addMedia.markAsAds) { var postponeWrap = addMedia.postponePreview && domPN(addMedia.postponePreview); var markAsAdsWrap = addMedia.markAsAds && domPN(geByClass1('page_preview_mark_as_ads_wrap', previewEl)); var nodesToDelete = []; for (var i = 0; i < previewEl.childNodes.length; i++) { var v = previewEl.childNodes[i]; if (v.nodeName == 'DIV' && v != postponeWrap && v != markAsAdsWrap) { nodesToDelete.push(v); } } each(nodesToDelete, function (i, v) { re(v); }); var newTypes = []; each(menu.types, function(i, v) { if (v[0] === 'postpone' && addMedia.postponePreview) { return; } else if (v[0] === 'mark_as_ads' && addMedia.markAsAds) { return; } newTypes.push(v); }); menu.setItems(newTypes); } else { val(previewEl, ''); addClass(previewEl, 'med_no_attach'); menu.setItems(menu.types); } if (addMedia.chosenMedia) { addMedia.chosenMedia = false; addMedia.chosenMediaData = false; } if (share = addMedia.shareData) { if (share.url) { addMedia.urlsCancelled.push(share.url); } if (share.initialPattern) { addMedia.urlsCancelled.push(share.initialPattern); } addMedia.shareData = {}; } each([addMedia.sharePreview, addMedia.pollPreview], function () {re(this);}); addMedia.sharePreview = addMedia.pollPreview = false; } if (opts.toggleLnk) show(lnk); } toggleClass(previewEl, 'media_preview_has_medias', addMedia.hasVisibleRows()); cur.onMediaChanged && cur.onMediaChanged(); cur.lastPostMsg = false; if (addMedia.onChange) addMedia.onChange(false); }, singleAdded: function(mediaEl, type) { if (type === 'postpone') { previewEl.appendChild(mediaEl); } else if (type === 'mark_as_ads') { if (addMedia.postponePreview) { previewEl.insertBefore(mediaEl, domLC(previewEl)); } else { previewEl.appendChild(mediaEl); } } else { if (domFC(previewEl)) { previewEl.insertBefore(mediaEl, domFC(previewEl)); } else { previewEl.appendChild(mediaEl); } } removeClass(previewEl, 'med_no_attach'); var newTypes = []; each(menu.lastTypes, function(i, v) { if (v[0] === 'postpone' && (addMedia.postponePreview || type === 'postpone')) { return; } else if (v[0] === 'mark_as_ads' && (addMedia.markAsAds || type === 'mark_as_ads')) { return; } else if (!inArray(type, ['postpone', 'mark_as_ads']) && !inArray(v[0], ['postpone', 'mark_as_ads'])) { return; } newTypes.push(v); }); menu.setItems(newTypes); if (opts.toggleLnk && !newTypes.length) { hide(lnk); } }, getMedias: function() { if (multi) { var edited = window.ThumbsEdit ? ThumbsEdit.getMedias('thumbs_edit' + lnkId) : [], already = {}; var chosen = addMedia.chosenMedias || [], result = [], check = function(id, ck, cv) { if (cv[0] + cv[1] == id) { result.push(cv); already[id] = true; return false; } }; each(edited, function(k, v) { each(chosen, check.pbind(v[0] + v[1])); }); each(dpicsEl.childNodes, function(k, v) { var m = (v.id || '').match(/^pam\d+_([a-z]+)(-?\d+_\d+)/); if (m) each(chosen, check.pbind(m[1] + m[2])); }); each(docsEl.childNodes, function(k, v) { var m = (v.id || '').match(/^pam\d+_([a-z]+)(-?\d+_\d+)/); if (m) each(chosen, check.pbind(m[1] + m[2])); }); each(chosen, function(k, v) { if (v && isArray(v) && v.length && !already[v[0] + v[1]]) { result.push(v); } }); return result; } else { var chosen = addMedia.chosenMedia; return chosen ? [chosen[0] + chosen[1]] : []; } }, showMediaProgress: function(type, i, info) { if (addMedia.onProgress && addMedia.onProgress(type, i, info) === false) { return false; } var frac = info.loaded / info.total, percent = intval(frac * 100), fileName = (info.fileName || info.name || '').replace(/[&<>"']/g, ''), ind = fileName ? i + '_' + fileName : i, label = fileName ? (fileName.length > 33 ? fileName.substr(0, 30) + '...' : fileName) : ''; var prg = ge('upload' + ind + '_progress'); if (!prg) { if (!cur.attachMediaIndexes) cur.attachMediaIndexes = {}; cur.attachMediaIndexes[ind] = lnkId; var labelEl = label ? '
' + label + '
' : ''; var progress = '\
\
\
\
\
\
\
\
' + labelEl + '
'; if (multi) { progressEl.appendChild(ce('div', {id: 'upload' + ind + '_progress_wrap', innerHTML: progress, className: 'clear_fix upload_' + i + '_progress'}, {marginTop: '6px'})); show(progressEl); if (opts.toggleLnk) toggle(lnk, addMedia.attachCount() < limit); } else { var mediaEl = ce('div', {id: 'upload' + ind + '_progress_wrap', innerHTML: progress, className: 'clear_fix upload_' + i + '_progress'}); addMedia.chosenMedia = 'progress'; addMedia.singleAdded(mediaEl, 'progress'); } opts.onChangedSize && opts.onChangedSize(); prg = ge('upload' + ind + '_progress'); var prgBar = geByClass1('ui_progress_bar', prg); if (percent) { setStyle(prgBar, {width: percent + '%'}) } else { setStyle(prgBar, {width: '1px'}); hide(prg); } } else { show(prg); var prgBar = geByClass1('ui_progress_bar', prg); setStyle(prgBar, {width: percent + '%'}); } }, hasVisibleRows: function() { var has = false; each(geByClass('media_preview', previewEl), function() { if (isVisible(this)) { has = true; return false; } }); return has; }, attachCount: function() { if (addMedia.attachedCount) { return addMedia.attachedCount(); } if (!previewEl) { return 0; } if (!multi) { return previewEl.childNodes.length - (addMedia.postponePreview ? 1 : 0) - (addMedia.markAsAds ? 1 : 0); } var num = (editable && window.ThumbsEdit ? ((ThumbsEdit.cache()['thumbs_edit' + lnkId] || {}).previews || []) : picsEl.childNodes).length + dpicsEl.childNodes.length + mpicsEl.childNodes.length + docsEl.childNodes.length / (docsEl.sorter ? 2 : 1) + progressEl.childNodes.length; if (addMedia.sharePreview) { ++num; } if (addMedia.pollPreview) { ++num; } return num; }, // Inline Polls createPoll: function(data) { var h = data.question ? '' : '1px', html = [], ans; var incCl = data[4 + (10 - 1) * 2] ? 'disabled' : '', decCl = data[4 + 2 * 2] ? '' : 'disabled'; addMedia.pollPreview = pdocsEl.appendChild(ce('div', {className: 'medadd_c medadd_c_poll', innerHTML: '\ \
' + data.lang.a + '
\
\
\
' + data.lang.i + '
\
' + (data.edit ? '' : '
' + data.lang.c + '
') + (data.pollSettings || '')})); if (!data.answers) data.answers = [[0, ''], [0, '']]; cur.pollAnswerTemplate = '
'; for (var i = 0, l = data.answers.length; i < l; ++i) { ans = data.answers[i]; html.push('
' + rs(cur.pollAnswerTemplate, { attrs: (ans[0] ? 'id="create_poll_ans' + ans[0] + '" ' : '') + (ans[1] ? '" value="' + ans[1] + '" ' : ''), lnkid: lnkId }) + '
'); if (i == 9) hide('create_poll_add' + lnkId); } val('create_poll_answers' + lnkId, html.join('')); if (data.question) { elfocus('create_poll_question' + lnkId); return; } addMedia.pollPreview.style.height = h; animate(addMedia.pollPreview, {height: 166}, 200, function() { addMedia.pollPreview.style.height = 'auto'; elfocus('create_poll_question' + lnkId); }); }, incPoll: function() { var answers = ge('create_poll_answers' + lnkId), l = answers.childNodes.length, max = opts.pollLimit || 10; if (l < max) { elfocus(geByTag1('input', answers.appendChild(ce('div', { className: 'medadd_c_polla_wr', innerHTML: rs(cur.pollAnswerTemplate, {attrs: '', lnkid: lnkId}) })))); } toggle('create_poll_add' + lnkId, l < max - 1); }, decPoll: function(el) { if (el.tt && el.tt.el) el.tt.destroy(); re(domPN(el)); show('create_poll_add' + lnkId); }, keyPoll: function(el, ev) { ev = ev || window.event; if (ev && (ev.keyCode == 10 || ev.keyCode == 13 || ev.keyCode == 9)) { var q = hasClass(el, 'medadd_c_pollq'), s = ev.shiftKey; if (s && q) return; var n = q ? domFC(domNS(domNS(el))) : (s ? domPS : domNS)(domPN(el)); if (n) { elfocus(geByTag1('input', n)); } else if (s) { elfocus(geByClass1('medadd_c_pollq', domPN(domPN(domPN(el))))); } else { this.incPoll(); } return cancelEvent(ev); } else { addMedia.changedPoll(); } }, changedPoll: function() { opts.onMediaChange && opts.onMediaChange(); }, pollData: function(silentCheck) { var answers = ge('create_poll_answers' + lnkId), q = trim(val('create_poll_question' + lnkId)), a; var result = {media: q, anonymous: isChecked('create_poll_anonymous' + lnkId)}, ind = 0, found = false; for (var el = domFC(answers); el; el = domNS(el)) { a = trim(val(domFC(el))); if (a) { var id = -intval((domFC(el).id.match(/^create_poll_ans(\d+)$/) || [0, -(ind++)])[1]); // -id or ind result['answers[' + id + ']'] = a; found = true; } } if (!q) { if (silentCheck !== true) { notaBene('create_poll_question' + lnkId); } return false; } if (!found) { if (!domFC(answers)) cur.addMedia[lnkId].incPoll(); if (silentCheck !== true) { notaBene(domFC(domFC(answers))); } return false; } return result; }, // Inline Share urlsCancelled: [], shareData: {}, checkMessageURLs: function(message, inactive, withTimeout) { if (cur.noCheckMessageURLs || addMedia.chosenMedia || addMedia.urlAttachmentLoading && addMedia.urlAttachmentLoading[0] > vkNow() - 10000 || addMedia.attachCount() >= limit) { return; } if (cur.reply_to && cur.reply_to[0]) { // prevent urls in club name from parsing var reply_name = Wall.getReplyName(cur.reply_to[0]); if (reply_name && isArray(reply_name) && reply_name[1]) { reply_name = reply_name[1]; } if (reply_name) { var urls_in_name = extractUrls(reply_name, inactive); for (var i in urls_in_name) { var url = urls_in_name[i].url; if (!url.match(/^https?:\/\//)) { url = 'http://' + url; } if (!inArray(url, addMedia.urlsCancelled)) { addMedia.urlsCancelled.push(url); } } } } var urls = extractUrls(message, inactive); for (var i in urls) { var urlInfo = urls[i]; var url = urlInfo['url'], query = urlInfo['query'], domain = urlInfo['domain'], initialUrl = url; if (!url.match(/^https?:\/\//)) { url = 'http://' + url; } if (inArray(url, addMedia.urlsCancelled) || inArray(initialUrl, addMedia.urlsCancelled)) { continue; } var valid = true; if (domain.match(/(^|\.|\/\/)(vkontakte\.ru|vk\.com)/)) { valid = query.match(/(#photo|^\/(photo|video|album|page|audio|doc)|z=(album|photo|video)|w=(page|product))(-?\d+_)?\d+|\.(jpg|png|gif)$|market-?\d+\?section=album_\d+|^\/stickers\/.+$|^\/blog\/.+$|^http:\/\/instagram\.com\/p\/.+/) ? true : false; } if (valid) { addMedia.checkURL(initialUrl, withTimeout); return; } } }, clearCheckURL: function() { clearTimeout(cur.checkURLTO); re(addMedia.urlAttachmentLoading[2]); if (multi) { toggle(progressEl, progressEl.childNodes > 0); } else { toggleClass(previewEl, 'med_no_attach', !previewEl.childNodes); } addMedia.urlAttachmentLoading = false; setStyle(bodyNode, {cursor: 'default'}); }, onCheckURLDone: function(result, data) { var url = ''; if (addMedia.urlAttachmentLoading) { url = addMedia.urlAttachmentLoading[1]; addMedia.clearCheckURL(); } if (result) { addMedia.chooseMedia(data[0], data[1], data[2], url, true); } else if (opts.onCheckURLDone) { opts.onCheckURLDone(result, data); } }, checkURL: function(url, withTimeout) { if (!url) return; addMedia.urlsCancelled.push(url); addMedia.urlAttachmentLoading = [vkNow(), url]; re(addMedia.checkURLForm); addMedia.checkURLForm = ce('div', {innerHTML: ''}); utilsNode.appendChild(addMedia.checkURLForm); var parseForm = addMedia.checkURLForm.appendChild(ce('form', { action: 'share.php?act=url_attachment', method: 'post', target: 'share_parse_iframe' + lnkId })); each({ hash : cur.share_timehash || cur.options.share.timehash || '', index : lnkId, url : url, to_mail: opts.mail ? 1 : '' }, function(i, v) { parseForm.appendChild(ce('input', {type: 'hidden', name: i, value: v})); }); setStyle(bodyNode, {cursor: 'wait'}); window.onUploadDone = addMedia.onCheckURLDone.pbind(true); window.onUploadFail = addMedia.onCheckURLDone.pbind(false); if (withTimeout) { cur.checkURLTO = setTimeout(function() { if (addMedia.urlAttachmentLoading.length > 0) { addMedia.clearCheckURL(); } }, withTimeout); } parseForm.submit(); }, addPreview: function(progress) { return (addMedia.sharePreview = ldocsEl.appendChild(ce('div', {className: 'medadd_c medadd_c_link', innerHTML: '
' + (progress ? '
' : '') + '
'}))); }, shareImgUrl: function(index) { var data = addMedia.shareData; if (data.images_proxy && data.images_proxy[index]) { return data.images_proxy_url + data.images_proxy[index]; } if (data.images) { var imgUrl = data.images[index]; if (isArray(imgUrl)) { if (imgUrl[0]) { imgUrl = imgUrl[0]; } else { imgUrl = ''; } } return imgUrl; } else { return ''; } }, showPreview: function(fast) { var data = addMedia.shareData, prev = addMedia.sharePreview || addMedia.addPreview(), image, bigLinkClass; if (data.images) { image = data.images[cur.shareShowImg]; bigLinkClass = addMedia.bigLink || data.big_link || (image && isArray(image) && image[0]) ? 'medadd_c_linkimg_big' : ''; } if (data.failed) { var html = getLang('page_not_loaded'); } else { var onloadStr = fast ? '' : 'onload="if (this.width < 130 && !cur.onLoadSwitched) {cur.onLoadSwitched=1;setTimeout(cur.shareShowNext, 0);}"'; var imghtml = ''; var imgUrl = clean(addMedia.shareImgUrl(cur.shareShowImg)); if (data.images && data.images[cur.shareShowImg] && imgUrl) { var curImage = data.images[cur.shareShowImg]; var style = bigLinkClass ? 'style="width: 100%"' : (data.imagesStyles && data.imagesStyles[cur.shareShowImg] || ''); imghtml = ''; imghtml += bigLinkClass ? Page.buildMediaLinkEl(data.domain) : ''; if (data.images.length > 0) { var leftScroller = ((data.images.length > 1) ? ('
') : ''); var rightScroller = ''; var closeButton = ''; if (cur.shareShowImg < (data.images.length - 1)) { rightScroller = '
'; } else if ((cur.shareShowImg == (data.images.length - 1)) && isArray(curImage) && !!curImage[0]) { rightScroller = ''; //closeButton = '
'; } var hasOwnPhoto = isArray(data.images[data.images.length - 1]) && !!data.images[data.images.length - 1][0]; var availableImagesCount = data.uniqueImagesCount + intval(hasOwnPhoto); var uploadTooltip = 'onmouseover="showTooltip(this, {text: \'' + getLang('global_link_choose_own_photo') + '\', black: 1, shift: [7, 11, 8], appendParentCls: \'post\'})"'; var removeTooltip = 'onmouseover="showTooltip(this, {text: \'' + getLang('global_link_remove_photo') + '\', black: 1, shift: [7, 11, 8], appendParentCls: \'post\'})"'; var imgControls = (!data.media || data.media == '_' ) ? '' : '
' + '
' + (availableImagesCount > 1 ? '
' + '
' + '
' + '
' : '' ) + '
'+ '
' + '
' + '
' + '
' + '
'; var containerImageStyle = image ? '' : 'display: none'; imghtml = '
' + imghtml + imgControls + closeButton + '
' + '
' ; } } var microdata = ''; if (data.microdata) { if (data.microdata_preview_html) { microdata = data.microdata_preview_html; } } var description = data.description_short || data.description; var html = imghtml + (data.title ? '

' + data.title + '

' : '') + (!bigLinkClass && data.domain ? '' : '') + //(data.domain ? '
' + data.domain + '
' : '') + (microdata ? '
' + microdata + '
' : '') + (description ? '
' + description + '
' : '') + '
'; } if (fast) { if (cur.preventShareAnim) { cur.preventShareAnim.stop(); clearInterval(cur.animateUpdateInterval); } val(domFC(prev), html); domFC(prev).style.height = 'auto'; shortCurrency(); } else { var hidden = !isVisible(ldocsEl); show(ldocsEl); var tmpDiv = ge(previewId).appendChild(ce('div', { innerHTML: '
' + html + '
' }, { position: 'absolute', width: getSize(prev)[0] - 10, visibility: 'hidden' })); var height = getSize(tmpDiv)[1]; re(tmpDiv); val(domFC(prev), html); shortCurrency(); cur.animateUpdateInterval = setInterval(function() { opts.onChangedSize && opts.onChangedSize(); }, 100); cur.preventShareAnim = animate(domFC(prev), {height: height}, 200, function() { clearInterval(cur.animateUpdateInterval); }); re(geByClass1('medadd_c_linkprg', ldocsEl)); } if (bigLinkClass) { addClass(geByClass1('medadd_c_linkcon', ldocsEl), bigLinkClass); } }, showExternalPreview: function () { var data = addMedia.shareData; if (!data.images) { data.images = []; } var _unique = [], _uniqueProxies = [], _uniqueMap = {}; each(data.images, function(i, im) { if (!_uniqueMap[im]) { _uniqueMap[im] = true; _unique.push(im); if (data.images_proxy) { _uniqueProxies.push(data.images_proxy[i]); } } }); data.uniqueImagesCount = _unique.length; data.images = _unique; data.images_proxy = _uniqueProxies; data.images.push([]); // holder for own photo if (!data.images || !data.images.length) { cur.shareShowImg = 0; addMedia.showPreview(); return; } else { cur.shareShowImg = -1; addMedia.addPreview(true); } data.imagesStyles = {}; var fast = false; cur.shareSetOwnPhoto = function (res) { if (curBox()) curBox().hide(); addMedia.bigLink = true; data.images[data.images.length-1] = [res.photo_url, res.user_id, res.photo_id]; cur.shareShowNext(0, 1); } cur.shareClearOwnPhoto = function () { data.images[data.images.length-1] = []; cur.shareShowNext(0, 0, 1); } cur.removeLinkImage = function(removeBtn) { var linkWrap = gpeByClass('medadd_c_linkcon', removeBtn); re(gpeByClass('medadd_c_linkimg_container', removeBtn)); setStyle(linkWrap, 'height', ''); addMedia.shareData.noPhoto = true; } cur.shareShowNext = function (previous, last, current) { var tmpImg = vkImage(); cur.prevShareShowDir = previous; if (current) { // nothing } else if (last) { cur.shareShowImg = data.images.length - 1; } else if (previous) { cur.shareShowImg -= 1; } else { cur.shareShowImg += 1; } var hasOwnPhoto = isArray(data.images[data.images.length - 1]) && !!data.images[data.images.length - 1][0]; if (!hasOwnPhoto && cur.shareShowImg > data.images.length - 2) { cur.shareShowImg = 0; } else if (cur.shareShowImg > data.images.length - 1) { cur.shareShowImg = 0; } else if (!hasOwnPhoto && cur.shareShowImg < 0) { cur.shareShowImg = data.images.length - 2; } else if (cur.shareShowImg < 0) { cur.shareShowImg = data.images.length - 1; } else if (cur.shareShowImg == 0) { for (var i = 1; i < data.images.length - 1; i++) { var t = vkImage(); t.src = addMedia.shareImgUrl(i); } } if (!data.images.length || isEmpty(data.images) || data.images[cur.shareShowImg] === undefined) { addMedia.showPreview(fast); fast = true; return; } var tmpImgSrc = addMedia.shareImgUrl(cur.shareShowImg); if (tmpImgSrc) { tmpImg.src = tmpImgSrc; } if (isArray(data.images[cur.shareShowImg]) && data.images[cur.shareShowImg][1] && data.images[cur.shareShowImg][2]) { data.user_id = data.images[cur.shareShowImg][1]; data.photo_id = data.images[cur.shareShowImg][2]; data.share_own_image = true; } else { data.user_id = undefined; data.photo_id = undefined; data.share_own_image = false; } var imgLoadTimeout = null; if (tmpImgSrc) { cur.imgLoadTimeout = imgLoadTimeout = setTimeout(function() { if (cur.shareImgInterval === true) return; if (isArray(data.images[cur.shareShowImg])) return; data.images.splice(cur.shareShowImg, 1); if (data.images_proxy && data.images_proxy.length > cur.shareShowImg) { data.images_proxy.splice(cur.shareShowImg, 1); } cur.shareShowNext(); }, 5000); } var showLoaderTimeout = setTimeout(function () { show('medadd_c_linkimg_loader'); showLoaderTimeout = null; opts.onChangedSize && opts.onChangedSize(); }, 100); cur.showLoaderTimeout = showLoaderTimeout; var updatePreview = function() { if (tmpImg.width || tmpImg.height || !tmpImgSrc) { var w = tmpImg.width, h = tmpImg.height; var imgStyle = ''; var imgParams = ''; if (imgLoadTimeout) { clearTimeout(imgLoadTimeout); imgLoadTimeout = null; } if (showLoaderTimeout) { clearTimeout(showLoaderTimeout); showLoaderTimeout = null; } hide('medadd_c_linkimg_loader'); clearInterval(cur.shareImgInterval); if (!isArray(data.images[cur.shareShowImg]) && (w < 20 || h < 20)) { data.images.splice(cur.shareShowImg, 1); if (data.images_proxy && data.images_proxy.length > cur.shareShowImg) { data.images_proxy.splice(cur.shareShowImg, 1); } if (data.images.length) { return setTimeout(cur.shareShowNext.pbind(0, 0, 1), 0); } } else { var bigLink = (w >= 537 && h >= 240) && data.big_link === undefined; if (!bigLink && addMedia.bigLink && (cur.shareShowImg != data.images.length - 1)) { data.images.splice(cur.shareShowImg, 1); data.images_proxy.splice(cur.shareShowImg, 1); if (!cur.prevShareShowDir) cur.shareShowImg --; cur.shareShowNext(cur.prevShareShowDir); return; } addMedia.bigLink = addMedia.bigLink || bigLink; if (w > 150) { h = 150 * h / w; w = 150; } var hHalf = (Math.round(h / 2)); var wHalf = (Math.round(w / 2)); var marginTop = (bigLink && (h > 150)) ? -Math.round(67/2) : -hHalf; var marginLeft = (w > 150) ? -Math.round(150/2) : -wHalf; //imgStyle = 'width: ' + w + 'px; height: ' + h + 'px; margin-top: ' + marginTop + 'px; margin-left: ' + marginLeft + 'px;'; imgStyle = 'width: ' + w + 'px; height: ' + h + 'px;'; if (bigLink) { imgStyle = 'width: 100%;'; } } if (data.images.length > 1) { imgParams = ''; } data.imagesStyles[cur.shareShowImg] = 'style="' + imgStyle + '"' + imgParams; addMedia.showPreview(fast); fast = true; } } clearInterval(cur.shareImgInterval); cur.shareImgInterval = setInterval(updatePreview, 300); cur.shareImgInterval2 = setTimeout(updatePreview, 0); } cur.shareShowNext(); }, uploadShare: function(callback) { var data = addMedia.shareData, prev = addMedia.sharePreview; var uploadCont = prev.appendChild(ce('div', {innerHTML: ''})), uploadForm = uploadCont.appendChild(ce('form', {action: '/share.php', method: 'post', target: 'share_upload_iframe' + lnkId})), photoUrl = data.images[cur.shareShowImg]; each({ act: 'a_photo', url: data.url, index: lnkId, image: photoUrl, extra: data.extra || 0, hash: vk.ip_h }, function (i, v) { uploadForm.appendChild(ce('input', {type: 'hidden', name: i, value: v})); }); window.onUploadDone = function(index, params) { window.onUploadFail = window.onUploadDone = function () {}; prev.removeChild(uploadCont); addMedia.shareData = extend(addMedia.shareData, { user_id: params.user_id, photo_id: params.photo_id, photo_url: photoUrl, images: [] }); setTimeout(callback, 0); }; window.onUploadFail = function(index, msg) { window.onUploadFail = window.onUploadDone = function () {}; prev.removeChild(uploadCont); addMedia.shareData.images = []; setTimeout(callback, 0); }; cur.shareLastParseSubmitted = vkNow(); uploadForm.submit(); }, setupPostpone: function(data, export_row) { var toEl; if (!multi && !ppdocsEl) { toEl = domPN(geByClass1('page_preview_postpone_wrap', previewEl)); } else { toEl = ppdocsEl; } var ed = (cur.editingPost && domPN(toEl).id == 'wpe_media_preview'), h = (ed || !multi) ? '' : '1px', addedhtml = false; var html = '
\
\
' + data.lang.profile_wall_postpone_at + '
\
'; if (cur.editingPost && data.friends_only != undefined) { html += '
'; if (data.status_export != undefined) { html += '
'; } if (data.facebook_export != undefined) { html += '
'; } html += '
'+ data.lang.friends_only +'
'; addedhtml = true; } else if (cur.editingPost && export_row) { html += export_row; addedhtml = true; } addMedia.postponePreview = toEl.appendChild(ce('div', {className: 'medadd_c medadd_c_timer clear_fix' + (addedhtml ? ' medadd_c_nofixed' : ''), innerHTML: html})); addMedia.postponePreview.style.height = h; stManager.add(['ui_controls.css', 'ui_controls.js', 'datepicker.css', 'datepicker.js'], function() { new Datepicker('postpone_date' + lnkId, {time: 'postpone_time' + lnkId, width: 155, noPast: true, minStep: 1, onUpdate: opts.onMediaChange}); if (!ed && multi) { animate(addMedia.postponePreview, {height: 33}, 200, function() { addMedia.postponePreview.style.height = ''; }); } }); }, destroy: function() { if ((docsEl || {}).sorter) { docsEl.sorter.destroy(); } if ((dpicsEl || {}).qsorter) { dpicsEl.qsorter.destroy(); } }, qsorterOpts: function() { return { xsize: Math.floor(dpicsEl.offsetWidth / 135), width: 135, height: 102, onReorder: opts.onAddMediaChange, clsUp: 'pam_dpic_up' }; }, resized: function() { if (window.ThumbsEdit) { ThumbsEdit.setWide('thumbs_edit' + cur.wallEditComposer.addMedia.lnkId); } if (dpicsEl.qsorter) { dpicsEl.qsorter.destroy(); qsorter.init(dpicsEl, addMedia.qsorterOpts()); } } } function initSelector(lnk, types, opts) { lnk = ge(lnk); if (!lnk) return false; opts = opts || {}; if (!window.__addMediaIndex) __addMediaIndex = 0; var menuId = ++__addMediaIndex; var html = '
'; lnk.innerHTML = html; var menuNode = domByClass(lnk, 'media_selector'); var reverseMargin = opts.reverseMargin || 25; var _hideTimer, mediaMenu = { id: menuId, menuNode: menuNode, types: types, lastTypes: types, activate: function(touched) { mediaMenu.touched = (touched === true); opts.onActivate && opts.onActivate(); }, show: function() { if (_hideTimer) { clearTimeout(_hideTimer); _hideTimer = 0; } if (!mediaMenu.moreWrap) return; if (hasClass(mediaMenu.moreWrap, 'shown')) return; if (!opts.forceToUp) { replaceClass(mediaMenu.moreWrap, 'to_up', 'to_down'); } var moreItems = domByClass(mediaMenu.moreWrap, '_more_items'), dy = getClientRectOffsetY(moreItems); if (dy > 0 || opts.forceToUp) { replaceClass(mediaMenu.moreWrap, 'to_down', 'to_up'); } setTimeout(addClass.pbind(mediaMenu.moreWrap, 'shown'), 0); }, hide: function(force) { if (_hideTimer) { return; } var _hide = function() { _hideTimer = 0; if (!mediaMenu.moreWrap) return; removeClass(mediaMenu.moreWrap, 'shown'); }; if (force) { var moreItems = domByClass(mediaMenu.moreWrap, '_more_items'); hide(moreItems); _hide(); setTimeout(show.pbind(moreItems), 0); } else { _hideTimer = setTimeout(_hide, 300); } }, setOptions: function(options) { extend(opts, options); }, setItems: function(types) { window.tooltips && tooltips.destroyAll(menuNode); while (menuNode.firstChild) { re(menuNode.firstChild); } var hideAfterCount = opts.hideAfterCount !== undefined ? opts.hideAfterCount : 4; var maxShown = opts.maxShown !== undefined ? opts.maxShown : 3; var moreNode = false; var hideItem = opts.hideItem; var needHide = (hideItem || (types.length > hideAfterCount)) && !browser.mobile; var hideLabel = hideItem && opts.hideLabel || getLang('global_media_selector_more'); mediaMenu.moreWrap = false; mediaMenu.lastTypes = types; each(types, function(i, v) { var type = v[0], label = v[1], handler = v[2]; var row; if (needHide && (hideItem ? type == hideItem : i == maxShown)) { var moreWrap = menuNode.appendChild(ce('div', {className: 'ms_items_more_wrap'})); addEvent(moreWrap, 'mouseover click', function(ev) { if (ev.type == 'mouseover' && mediaMenu.touched) return; mediaMenu.show(); }); addEvent(moreWrap, 'mouseout', function () { mediaMenu.hide(); }); row = moreWrap.appendChild(ce('a', { className: 'ms_item_more', innerHTML: '' + hideLabel + '' })); row.setAttribute('tabindex', 0); var moreNodeHelper = ce('div', {className: 'ms_items_more_helper'}); moreNode = ce('div', {className: 'ms_items_more _more_items'}); moreNodeHelper.appendChild(moreNode); row = moreWrap.appendChild(moreNodeHelper); mediaMenu.moreWrap = moreWrap; } row = (moreNode ? moreNode : menuNode).appendChild(ce('a', { innerHTML: moreNode ? label : '' + label + '', className: 'ms_item ms_item_' + type + ' _type_' + type })); row.setAttribute('tabindex', 0); if (!moreNode) { row.setAttribute('data-title', label); row.setAttribute('aria-label', label); row.setAttribute('role', 'link'); addEvent(row, 'mouseover', function(){ showTitle(this, false, false, {noZIndex: true}); }); } if (handler) { addEvent(row, 'click', function () { mediaMenu.hide(true); if (opts.onItemClick && !opts.onItemClick(type)) { return false; } handler(); return false; }); } }); } }; types && mediaMenu.setItems(types); if (browser.msie) { removeEvent(lnk, 'MSPointerDown'); // for ie10 touch addEvent(lnk, 'MSPointerDown', mediaMenu.activate.pbind(true)); } removeEvent(lnk, 'mouseover'); addEvent(lnk, 'mouseover click', mediaMenu.activate); if (!opts.global) { cur.destroy.push(function() { removeEvent(lnk, 'mouseover click', mediaMenu.activate); }); } return mediaMenu; } if (!cur.addMedia) { cur.addMedia = {}; } cur.addMedia[lnkId] = addMedia; if (opts.onAddMediaChange) addMedia.onChange = opts.onAddMediaChange; return addMedia; } break; } } }; try{stManager.done('api/widgets/al_comments.js');}catch(e){}